Personal computer systems in general and IBM personal computers in particular have attained widespread use for providing computer power to many segments of today's modern society. Personal computer systems can usually be defined as a desk top, floor standing, or portable microcomputer that consists of a system unit having a single system processor and associated volatile and non-volatile memory, a display monitor, a keyboard, one or more diskette drives, a fixed disk storage (also known as a direct access storage device or "DASD"), and an optional printer. One of the distinguishing characteristics of these systems is the use of a motherboard or system planar to electrically connect these components together. These systems are designed primarily to give independent computing power to a single user and are inexpensively priced for purchase by individuals or small businesses. Examples of such personal computer systems are IBM's PERSONAL COMPUTER AT and IBM's PERSONAL SYSTEM/2 Models 25, 30, L40SX, 50, 55, 56, 57, 65, 70, 80, 90 and 95.
These systems can be classified into two general families. The first family, usually referred to as Family I Models, use a bus architecture exemplified by the IBM PERSONAL COMPUTER AT and other "IBM compatible" machines. The second family, referred to as Family II Models, use IBM's MICRO CHANNEL bus architecture exemplified by IBM's PERSONAL SYSTEM/2 Models 50 through 95. The Family I models typically have used the popular INTEL 8088 or 8086 microprocessor as the system processor. These processors have the ability to address one megabyte of memory. The Family II (and some Family I) models typically use the high speed INTEL 80286, 80386, and 80486 microprocessors which can operate in a real mode to emulate the slower speed INTEL 8086 microprocessor or a protected mode which extends the addressing range from 1 megabyte to 4 Gigabytes for some models. In essence, the real mode feature of the 80286, 80386, and 80486 processors provide hardware compatibility with software written for the 8086 and 8088 microprocessors.
In today's market, there is always the need for a less expensive way to implement necessary computer functions. Many personal computer users neither need nor are willing to pay for leading edge technology and speed. Rather, they are looking for the most inexpensive way to obtain computer tools. These users do not use multi-tasking operating systems; in fact, most use DOS. Since their requirements are simple, a low-cost solution is the most advantageous to them.
Small computer systems interface (or "SCSI") controllers (also known herein as "interface controllers") that have been implemented for controlling direct access storage devices (or "DASD") in Family II systems are very high in function, and support multiple operations concurrently. This was done to get the best performance possible out of multitasking operating systems. Of course, this performance costs money, and not every user wishes to pay for something he does not need or use. So, in order for products to be competitive in a market segment in which performance is not so critical, low cost solutions are required.
The preferred interface controller for a state of the art system is a high-integration, high-function solution. It typically uses an ASIC chip, a microprocessor, local ROM, local RAM, and an oscillator to drive the subsystem. The host system contains two BIOS ROMs, which contain CPU code to drive the subsystem, as well as code to drive other functions not related to the SCSI controller.
One large ASIC provides most of the hardware function of the SCSI controller subsystem. It has essentially three interfaces. One is to the system CPU's local processor bus. This is used to transfer data to and from the system, and allows the system to communicate with the main control registers. The second interface is to the local microprocessor which controls the low-level functions of the subsystem. Through this interface, all of the ASIC's registers can be read and written. Note that most of these registers are not accessible by the system CPU, since it does not need to control any of the low-level functions. Lastly, there is an interface to the SCSI bus, through which data and control signals pass to and from the various peripheral devices such as DASD.
The processor used as a sub-system processor in one example of such a design is an Intel 8032. The ROM contains microcode to drive the subsystem and the RAM is used for local storage. This allows all of the low-level processing work to be off-loaded from the main system CPU. The CPU gives complex commands to the subsystem, and the subsystem executes them in full and returns the data and results to the system. This design is considered ideal when multitasking is a requirement.
This and all other existing SCSI controllers interface to the system with a defined set of registers. These registers are fixed in both function and relative location, only the base address can vary from card to card. This architecture has become a de facto standard for Family II SCSI controllers and all existing designs follow this convention. The registers are as follows:
CIR Command Interface Register--This register communicates either a four byte immediate command, or the system memory address of a system control block (an "SCB") to be processed. PA0 ATTN Attention Register--This register tells the subsystem to start a command. PA0 BCR Basic Control Register--This register tells the subsystem to perform a reset, and enable or disable system interrupts or data transfer. PA0 Interrupt Status Register--This register alerts the system that status is available for an outstanding command. PA0 BSR Basic Status Register--This register has bits that provide the system with general status of the subsystem, such as, an interrupt is pending, or the Command Interface Register is full or empty.
Usually, these registers are not hard wired into the main functional logic of the SCSI controller, but rather provide "windows" through which the system CPU can talk to the subsystem microprocessor. Thus when the ATTN register is written to by the system, the ASIC generates an interrupt to the 8032. This interrupt tells the microprocessor that the registers have been loaded by the system. The microprocessor then reads the registers, interprets the high-level command that was issued, and performs the low-level operations necessary to process the command. Decisions to do retries, error recovery, or caching are done by the subsystem microprocessor, and then performed. When a command is complete, status is given back to the system CPU through one of the interface registers, or "windows". By writing back to these registers, the sub-system microprocessor causes an interrupt to be generated for the system CPU, indicating that the command is complete.